package cn.com.zero.manager.auth.service.impl;

import cn.com.zero.base.exception.ErrorCodeException;
import cn.com.zero.base.service.BaseService;
import cn.com.zero.manager.auth.mapper.IRoleMapper;
import cn.com.zero.manager.auth.po.MenuPO;
import cn.com.zero.manager.auth.po.RolePO;
import cn.com.zero.manager.auth.service.IRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

/**
 * @author guoxin
 * @version 1.0.0
 * @Description
 * @date 2023/3/3 10:35
 */
@Service
public class RoleService extends BaseService implements IRoleService {

    /**
     * 角色数据mapper
     */
    private IRoleMapper roleMapper;

    /**
     * 查询角色列表
     *
     * @return
     */
    @Override
    public List<RolePO> queryRoleList() {
        return roleMapper.queryRoleList();
    }

    /**
     * 验证角色名称是否存在
     *
     * @param roleName  角色名称
     * @return
     */
    @Override
    public boolean isExistName(String roleName) {
        RolePO rolePO = roleMapper.isExistName(roleName);
        if(Objects.isNull(rolePO)){
            return false;
        }
        return true;
    }

    /**
     * 验证角色编号是否存在
     *
     * @param roleCode  角色编号
     * @return
     */
    @Override
    public boolean isExistRoleCode(String roleCode) {
        RolePO rolePO = roleMapper.isExistRoleCode(roleCode);
        if(Objects.isNull(rolePO)){
            return false;
        }
        return true;
    }

    /**
     * 查询所有菜单
     *
     * @return
     */
    @Override
    public List<MenuPO> queryMenuList() {
        return roleMapper.selectMenuList();
    }

    /**
     * 查询属于某个系统的所有菜单
     *
     * @param systemId  系统编号
     * @return
     */
    @Override
    public List<MenuPO> querySystemMenuList(String systemId) {
        return roleMapper.querySystemMenuList(systemId);
    }

    /**
     * 添加角色
     * @param roleCode  角色编号
     * @param roleName  角色名称
     * @param note      备注信息
     * @param sort      排序号
     * @param menus     菜单权限
     */
    @Override
    @Transactional(rollbackFor = Throwable.class)
    public void addRole(String roleCode, String roleName, String note, Integer sort, Long[] menus) {
        RolePO existRoleCode = roleMapper.isExistRoleCode(roleCode);
        if(!Objects.isNull(existRoleCode)){
            logger.error("角色编号{}已存在", roleCode);
            throw new ErrorCodeException(-114511L);
        }
        RolePO existName = roleMapper.isExistName(roleName);
        if(!Objects.isNull(existName)){
            logger.error("角色名称{}已存在", roleName);
            throw new ErrorCodeException(-114510L);
        }
        roleMapper.addRole(roleCode,roleName,note,sort);
        roleMapper.addRoleMenu(roleCode,menus);
        roleMapper.addManageRole(roleCode);
    }

    /**
     * 修改角色
     *
     * @param roleCode  编号
     * @param roleName  名称
     * @param sort      排序号
     * @param note      备注信息
     */
    @Override
    @Transactional(rollbackFor = Throwable.class)
    public void updateRole(String roleCode, String roleName, Integer sort, String note) {
        RolePO existRoleCode = roleMapper.isExistRoleCode(roleCode);
        if(Objects.isNull(existRoleCode)){
            logger.error("角色编号{}不存在", roleCode);
            throw new ErrorCodeException(-1145110L);
        }
        RolePO existName = roleMapper.isExistName(roleName);
        if(!Objects.isNull(existName)){
            logger.error("角色名称{}已存在", roleName);
            throw new ErrorCodeException(-114510L);
        }
        roleMapper.updateRole(roleCode,roleName,sort,note);
    }

    /**
     * 删除角色
     *
     * @param roles 角色编号集合
     */
    @Override
    @Transactional(rollbackFor = Throwable.class)
    public void deleteRoleBatch(String[] roles) {
        roleMapper.deleteRoleBatch(roles);
        roleMapper.deleteRoleMenuBatch(roles);
        roleMapper.deleteRoleManageBatch(roles);
    }

    /**
     * 查询角色有权限的菜单集合
     *
     * @param roleCode  角色编号
     * @return
     */
    @Override
    public List<Long> queryRoleMenuList(String roleCode) {
        return roleMapper.queryRoleMenuList(roleCode);
    }

    /**
     * 修改角色菜单权限
     *
     * @param roleCode  角色编号
     * @param menus     菜单权限
     */
    @Override
    @Transactional(rollbackFor = Throwable.class)
    public void setRoleMenus(String roleCode, Long[] menus) {
        RolePO existRoleCode = roleMapper.isExistRoleCode(roleCode);
        if(Objects.isNull(existRoleCode)){
            logger.error("角色编号{}不存在", roleCode);
            throw new ErrorCodeException(-1145110L);
        }
        roleMapper.deleteRoleMenu(roleCode);
        roleMapper.addRoleMenu(roleCode,menus);
    }

    /**
     * 查询角色关联的管理员
     *
     * @param roleCode  角色编号
     * @return
     */
    @Override
    public List<String> queryRoleAdminList(String roleCode) {
        return roleMapper.queryRoleAdminList(roleCode);
    }

    @Autowired
    public void setRoleMapper(IRoleMapper roleMapper) {
        this.roleMapper = roleMapper;
    }
}
